#define BOOST_TEST_MODULE testDataElementItemType

#include <boost/test/unit_test.hpp>

#include "common/helpers/container_helper.hpp"

#include "common/elements/element_maker.h"
#include "common/elements/item_type.h"

#include "datenaro/database/data_elements/data_item_type.h"
#include "datenaro/database/data_gate.h"
#include "datenaro/database/migrator.h"

BOOST_AUTO_TEST_CASE(testDataElementItemType)
{
    // Создание и апгрейд БД.
    const auto migrationResult = Database::Migrator("test.db").run();
    assert(0 == migrationResult);

    Database::DataGate gate("test.db");

    // Создание тестируемого объекта предметной области с конкретным идентификатором.
    auto first = std::make_shared<Elements::ItemType>();
    first->setId(1);
    first->setWorkflowId(2);
    first->setDefaultStateId(3);
    first->setCaption("a");
    first->setKind(Elements::ItemType::Kind::Issue);

    // Сохранение в тестовую БД.
    gate.saveElement(first);

    // Чтение из тестовой БД и проверка полей.
    auto second = gate.loadElement(Elements::ElementType::ItemType, 1)->elementCast<Elements::ItemType>();
    BOOST_CHECK(1 == second->id());
    BOOST_CHECK(2 == second->workflowId());
    BOOST_CHECK(3 == second->defaultStateId());
    BOOST_CHECK("a" == second->caption());
    BOOST_CHECK(Elements::ItemType::Kind::Issue == second->kind());

    // Удаление из тестовой БД и проверка, объект был и удалился.
    BOOST_CHECK(true == Common::contains(gate.getElementsIds(Database::DataItemType::ids), 1));
    gate.remove(Database::DataItemType::removeOne, 1);
    BOOST_CHECK(false == Common::contains(gate.getElementsIds(Database::DataItemType::ids), 1));

    // Удаление всех объектов данного типа из тестовой БД.
    gate.remove(Database::DataItemType::remove, gate.getElementsIds(Database::DataItemType::ids));

    // Имитация нового объекта.
    first->setId(0);

    // Сохранение в тестовую БД.
    gate.saveElement(first);

    // Элементу назначен идентификатор при сохранении в БД.
    BOOST_CHECK(0 != first->id());

    // Чтение из тестовой БД и проверка полей.
    auto third = gate.loadElement(Elements::ElementType::ItemType, 1)->elementCast<Elements::ItemType>();
    BOOST_CHECK(1 == third->id());
    BOOST_CHECK(2 == third->workflowId());
    BOOST_CHECK(3 == third->defaultStateId());
    BOOST_CHECK("a" == third->caption());
    BOOST_CHECK(Elements::ItemType::Kind::Issue == third->kind());

    // Удаление всех объектов данного типа из тестовой БД.
    gate.remove(Database::DataItemType::remove, gate.getElementsIds(Database::DataItemType::ids));
}
